package com.itaem.community.modules.vote.controller;



import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itaem.community.core.annotations.ResponseResult;
import com.itaem.community.modules.vote.entity.UserVoteEntity;
import com.itaem.community.modules.vote.entity.VoteEntity;
import com.itaem.community.modules.vote.service.UserVoteService;
import com.itaem.community.modules.vote.service.VoteService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;


//testing

/**
 * <p>
 * 用户是否投票表 前端控制器
 * </p>
 *
 * @author tomato
 * @since 2020-10-28
 */
@Api(tags = "用户投票")
@ResponseResult
@RestController
@RequestMapping("/userVote")
@Slf4j
public class UserVoteController {

    @Autowired
    private UserVoteService userVoteService;

    @Autowired
    private VoteService voteService;
    /**
     * 分页查询所有用户的所有投票
     * @param page 第几页
     * @param size 每页多大
     * @return 分页查询结果
     */
//    @RequiresRoles(value = {"超级管理员","物业工作人员","业主","维修工"}, logical = Logical.OR)
    @ApiOperation("分页查询信息")
    @GetMapping("/{page}/{size}")
    public Page<UserVoteEntity> list(@PathVariable Long page, @PathVariable Long size){
        return userVoteService.page(new Page<>(page, size));
    }

    /**
     * 根据用户是否投票id获取单条信息
     * @param id 用户投票表id
     * @return 一条用户投票表信息
     */
//    @RequiresRoles(value = {"超级管理员","物业工作人员","业主","维修工"}, logical = Logical.OR)
    @ApiOperation("获取单条信息")
    @GetMapping("/{id}")
    public UserVoteEntity info(@PathVariable Long id){
        return userVoteService.getById(id);
    }

    /**
     * 新增一条用户是否投票信息
     * 这个应该是在投票创建后对所有该物业下已有的用户都需要创建的一个默认未投票的表吧？
     * @param userVoteEntity 用户投票信息
     * @return 是否新增用户投票成功
     */
//    @RequiresRoles(value = {"超级管理员","物业工作人员","业主","维修工"}, logical = Logical.OR)
    @ApiOperation("新增")
    @PostMapping
    public Boolean save(@RequestBody UserVoteEntity userVoteEntity) {
        userVoteEntity.setVoted(false);
        return userVoteService.save(userVoteEntity);
    }

    /**
     * 根据id修改用户投票表更新，这个功能应该不需要实现，但是可以写着玩
     * @param userVoteEntity 用户投票数据
     * @return 更新是否成功
     */
//    @RequiresRoles(value = {"超级管理员","物业工作人员","业主","维修工"}, logical = Logical.OR)
    @ApiOperation("更新")
    @PatchMapping
    public Boolean update(@RequestBody UserVoteEntity userVoteEntity) {
        return userVoteService.update(
                userVoteEntity, new UpdateWrapper<UserVoteEntity>().eq("id", userVoteEntity.getId()));
    }

    /**
     * 根据id逻辑删除一个用户投票，这个功能应该是不用做的
     * @param id 用户投票表id
     * @return 是否删除成功
     */
//    @RequiresRoles(value = {"超级管理员","物业工作人员","业主","维修工"}, logical = Logical.OR)
    @ApiOperation("删除")
    @DeleteMapping("/{id}")
    public Boolean remove(@PathVariable Long id) {
        return userVoteService.removeById(id);
    }

    /**
     * 用户投票
     * @param id 用户投票表id
     * @return 是否成功投票
     */
//    @RequiresRoles(value = {"超级管理员","物业工作人员","业主","维修工"}, logical = Logical.OR)
    @ApiOperation("用户投票")
    @PatchMapping("Vote/{id}")
    public Boolean vote(@PathVariable Long id) {
        UserVoteEntity userVoteEntity = userVoteService.getById(id);
        //检验是否已投票
        if(userVoteEntity.getVoted().equals(true)){
            log.info("用户已投票");
            return true;
        }
        //将此投票修改为已投票
        userVoteEntity.setVoted(true);
        //用户投票后将投票表里的已投票数+1
        VoteEntity voteEntity = voteService.getOne(
                new QueryWrapper<VoteEntity>().eq("id",userVoteEntity.getVoteId()));
        voteEntity.setVotedNumber(voteEntity.getVotedNumber() + 1);
        //如果此用户投票完后该投票所需投票数和投票数相等，可以通知用户投票结果了
        if(voteEntity.getRequiredNumber().equals(voteEntity.getVotedNumber())){
            log.info("投票已结束，可以告诉用户投票结果了");
            voteEntity.setCompleted(true);
        }
        voteService.update(voteEntity, new UpdateWrapper<VoteEntity>().eq("id",voteEntity.getId()));
        return userVoteService.update(
                userVoteEntity, new UpdateWrapper<UserVoteEntity>().eq("id", id));
    }
}

